﻿// ------------------------------------------------------------------------
// 项目名称：Canroc.Net 
// 版权归属：Canroc（https://gitee.com/canroc）
//
// 许可证信息
// Canroc.Net项目主要遵循 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-APACHE 文件。
//
// 使用条款：
// 1.使用本项目应遵守相关法律法规和许可证的要求。
// 2.不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动。
// 3.任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任
//
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
//
// 其他重要信息
// Canroc.Net 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// ------------------------------------------------------------------------

namespace Canroc.Net.Application.ExternalCallback.Dto;

/// <summary>
///     订单退款回调输入项
/// </summary>
public class WeChatPayRefundCallbackInput
{
    /// <summary>
    ///     通知的唯一ID
    /// </summary>
    [Required]
    [MaxLength(36)]
    public string Id { get; set; } = string.Empty;

    /// <summary>
    ///     通知创建的时间
    /// </summary>
    [JsonPropertyName("create_time")]
    public DateTime CreateTime { get; set; }

    /// <summary>
    ///     通知的类型
    /// </summary>
    /// <remarks>
    ///     REFUND.SUCCESS：退款成功通知
    ///     REFUND.ABNORMAL：退款异常通知
    ///     REFUND.CLOSED：退款关闭通知
    /// </remarks>
    [MaxLength(32)]
    [JsonPropertyName("event_type")]
    public string EventType { get; set; } = string.Empty;

    /// <summary>
    ///     通知简要说明
    /// </summary>
    [MaxLength(16)]
    [JsonPropertyName("summary")]
    public string Summary { get; set; } = string.Empty;

    /// <summary>
    ///     通知的资源数据类型
    /// </summary>
    /// <remarks>
    ///     退款成功通知为encrypt-resource
    /// </remarks>
    [Required]
    [MaxLength(32)]
    [JsonPropertyName("resource_type")]
    public string ResourceType { get; set; } = string.Empty;

    /// <summary>
    ///     通知资源数据
    /// </summary>
    [JsonPropertyName("resource")]
    public WeChatPayRefundCallbackResource Resource { get; set; } = new();
}

/// <summary>
///     微信退款通知资源数据
/// </summary>
public class WeChatPayRefundCallbackResource
{
    /// <summary>
    ///     加密算法类型
    /// </summary>
    [Required]
    [MaxLength(32)]
    [JsonPropertyName("algorithm")]
    public string Algorithm { get; set; } = string.Empty;

    /// <summary>
    ///     加密前的对象
    /// </summary>
    /// <remarks>
    ///     退款通知的类型为refund
    /// </remarks>
    [Required]
    [MaxLength(32)]
    [JsonPropertyName("original_type")]
    public string OriginalType { get; set; } = string.Empty;

    /// <summary>
    ///     加密数据
    /// </summary>
    [Required]
    [MaxLength(1048576)]
    [JsonPropertyName("ciphertext")]
    public string Ciphertext { get; set; } = string.Empty;

    /// <summary>
    ///     附加数据
    /// </summary>
    [MaxLength(16)]
    [JsonPropertyName("associated_data")]
    public string? AssociatedData { get; set; }

    /// <summary>
    ///     随机串
    /// </summary>
    [MaxLength(32)]
    [JsonPropertyName("nonce")]
    public string Nonce { get; set; } = string.Empty;
}